package com.wingsboat.common.protect.annotation;

import com.wingsboat.common.protect.keyconvert.KeyConvert;
import com.wingsboat.common.protect.keyconvert.impl.DefaultAthenaLockKeyConvert;
import com.wingsboat.common.protect.lockProcessor.AthenaLockProcessor;
import com.wingsboat.common.protect.lockProcessor.impl.DefaultLockProcessor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 事务枷锁注解
 * 解决事务与锁并发问题
 * 保证锁和事务的先后顺序
 *
 * @author wangzhong
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AthenaLock {

    /** 前缀**/
    String prefix() default "athenaLock";

    /** key转换器**/
    Class<? extends KeyConvert> keyConvert() default DefaultAthenaLockKeyConvert.class;

    /** spEL 表达式**/
    String spEl() default "";

    /** key分隔符**/
    String keySeparator() default ":";

    /** 锁的过期时间--分布式采用**/
    long leaseTime() default 10 * 1000;

    /**
     * 锁处理器
     * 自定义，默认采用单机锁
     * 分布式自定义
     * @return
     */
    Class<? extends AthenaLockProcessor> lockProcessor() default DefaultLockProcessor.class;
}
